package validator

import (
	"reflect"

	"gitee.com/knowgo/ego/core/types"
)

type Validator interface {
	// IsValidate 调用之前 data 参数要先 reflect.Indirect()
	IsValidate(field string, data reflect.Value) error
	// 返回描述信息
	String() string
}

func NewValidator(typ reflect.Type, tagItem string) Validator {
	if typ.Kind() == reflect.Ptr {
		typ = typ.Elem()
	}
	switch typ.Kind() {
	case reflect.Slice:
		return NewContainerValidator(tagItem, "array")
	case reflect.Map:
		return NewContainerValidator(tagItem, "map")
	case reflect.Struct:
		if types.IsTimeType(typ) {
			// 时间类型
			return nil
		} else {
			// 自定义结构
			return nil
		}
	case reflect.String:
		return NewStringValidator(tagItem)
	case reflect.Int:
		return NewNumberValidator[int](tagItem)
	case reflect.Int8:
		return NewNumberValidator[int8](tagItem)
	case reflect.Int16:
		return NewNumberValidator[int16](tagItem)
	case reflect.Int32:
		return NewNumberValidator[int32](tagItem)
	case reflect.Int64:
		return NewNumberValidator[int64](tagItem)
	case reflect.Uint:
		return NewNumberValidator[uint](tagItem)
	case reflect.Uint8:
		return NewNumberValidator[uint8](tagItem)
	case reflect.Uint16:
		return NewNumberValidator[uint16](tagItem)
	case reflect.Uint32:
		return NewNumberValidator[uint32](tagItem)
	case reflect.Uint64:
		return NewNumberValidator[uint64](tagItem)
	case reflect.Float32:
		return NewNumberValidator[float32](tagItem)
	case reflect.Float64:
		return NewNumberValidator[float64](tagItem)
	}

	return nil
}

// func getTypeName(val interface{}) string {
// 	return reflect.Indirect(reflect.ValueOf(val)).Type().Name()
// 	// return reflect.TypeOf(val).Name()
// }

// type Required struct{}

// func (r *Required) IsValidate(field string, data reflect.Value) error {
// 	if data.IsZero() {
// 		return NewErrRequired(field)
// 	}
// 	return nil
// }

// func (r *Required) String() string {
// 	return ""
// }
